#ifndef __BMP280__H__
#define __BMP280__H__

#include "sys.h"
#include "iic.h"

#define BMP280_ADDRESS				0xEE		//八位地址
#define BMP280_ADDRESS_7BIT 	0x77		//七位地址（SDO接GND为0x76,接VCC为0x77）

#define BMP280_ID 						0xD0		// 器件ID
#define BMP280_RESET 					0xE0		// 复位
#define BMP280_STATUS 				0xF3		// 状态
#define BMP280_CTRL_MEAS 			0xF4		// 控制--设置设备的数据采集选项(电源，温度，气压)
#define BMP280_CONFIG 				0xF5		// 配置--设置设备的速率、滤波器和接口选项。在正常模式下，对"配置"寄存器的写入可能会被忽略。睡眠模式下的写入不会被忽略。
#define BMP280_PRESS_MSB  		0xF7		// 气压数据--高8位
#define BMP280_PRESS_LSB 			0xF8		// 气压数据--中8位
#define BMP280_PRESS_XLSB 		0xF9		// 气压数据--低4位（8为中的高4位）
#define BMP280_TEMP_MSB 			0xFA		// 温度数据--高8位
#define BMP280_TEMP_LSB 			0xFB		// 温度数据--中8位
#define BMP280_TEMP_XLSB 			0xFC		// 温度数据--低4位（8为中的高4位）

// 以下为校准数据，两个寄存器(0X88/0X89)的值为一个16位的数据，默认连读，所以就不写两个寄存器地址了
#define BMP280_CALIBRATION_T1		0x88		// unsigned short
#define BMP280_CALIBRATION_T2		0x8A		// signed short
#define BMP280_CALIBRATION_T3		0x8C		// signed short
#define BMP280_CALIBRATION_P1		0x8E		// unsigned short
#define BMP280_CALIBRATION_P2		0x90		// signed short
#define BMP280_CALIBRATION_P3		0x92    // signed short
#define BMP280_CALIBRATION_P4		0x94    // signed short
#define BMP280_CALIBRATION_P5		0x96    // signed short
#define BMP280_CALIBRATION_P6		0x98    // signed short
#define BMP280_CALIBRATION_P7		0x9A    // signed short
#define BMP280_CALIBRATION_P8		0x9C    // signed short
#define BMP280_CALIBRATION_P9		0x9E    // signed short
#define BMP280_CALIBRATION_xx		0xA1		// 保留


typedef unsigned          		char uint8_t;
typedef unsigned short     		int uint16_t;
typedef unsigned           		int uint32_t;
typedef long signed int 			BMP280_S32_t;
typedef long unsigned int 		BMP280_U32_t;
typedef long long signed int 	BMP280_S64_t;

/************************	建议搭配表(官方手册写的) ********************************

过采样设置					压力过采样									典型压力分辨率		建议的温度过采样		
压力测量跳过				跳过(输出设置为0x80000)			---							根据需要
超低功							x1												16 位/2.62 Pa		x1
低功率							×2												17 位/1.31 帕		×1
标准分辨率					×4												18 位/0.66 Pa		x1
高分辨率						×8												19 位/0.33 Pa		×1
超高分辨率					×16												20 位/0.16 帕		×2

********************************************************************************/

/*	电源模式配置
睡眠模式：不进行测量。
正常模式：在测量期和非活动待机期之间的自动永久循环。
强制模式：只进行一次测量。测量结束后,传感器返回休眠模式。
*/
typedef enum
{
	BMP280_Power_Sleep		= 0x00,				// 睡眠模式
	BMP280_Power_Coerce		= 0x01,				// 强制模式
	BMP280_Power_Normal		= 0x03,				// 正常模式
}
BMP280_PowerConfig;

// 气压采样配置
typedef enum
{
	BMP280_Press_No		= 0x00,				// 跳过气压测量
	BMP280_Press_X1		= 0x04,				// 分辨率 X1 	（16位/2.26Pa）
	BMP280_Press_X2		= 0x08,				// 分辨率 X2 	（17位/1.31Pa）
	BMP280_Press_X4		= 0x0C,				// 分辨率 X4 	（18位/0.66Pa）
	BMP280_Press_X8		= 0x10,				// 分辨率 X8 	（19位/0.33Pa）
	BMP280_Press_X16	= 0x1C,				// 分辨率 X16	（20位/0.16Pa）
}
BMP280_PressConfig;

// 温度采样配置
typedef enum
{
	BMP280_Temp_No		= 0x00,				// 跳过温度测量
	BMP280_Temp_X1		= 0x20,				// 分辨率 X1 	（16位/0.0050度）
	BMP280_Temp_X2		= 0x40,				// 分辨率 X2 	（17位/0.0025度）
	BMP280_Temp_X4		= 0x60,				// 分辨率 X4 	（18位/0.0012度）
	BMP280_Temp_X8		= 0x80,				// 分辨率 X8 	（19位/0.0006度）
	BMP280_Temp_X16		= 0xE0,				// 分辨率 X16	（20位/0.0003度）
}
BMP280_TempConfig;

/*************************	正常模式下的典型输出数据速率(ODR) [赫兹](官方手册写的) ***************************

过采样设置		待机[毫秒]
						0.5				62.5		125			250			500			1000		2000		4000
超低功耗			166.67		14.71		7.66		3.91		1.98		0.99		0.50		0.25
低功率				125.00		14.29		7.55		3.88		1.97		0.99		0.50		0.25
标准分辨率		83.33			13.51		7.33		3.82		1.96		0.99		0.50		0.25
高分辨率			50.00			12.20		6.92		3.71		1.92		0.98		0.50		0.25
超高分辨率		26.32			10.00		6.15		3.48		1.86		0.96		0.49		0.25

**********************************************************************************************************/
/************************************************	噪声表(官方手册写的) **************************************

****压力噪声ODR(Hz)****
典型压力均方根噪声 [Pa]
过采样设置				IIR滤波器系数
								关闭		2			4			8			16
超低功耗					3.3		1.9		1.2		0.9		0.4
低功率						2.6		1.5		1.0		0.6		0.4
标准分辨率				2.1		1.2		0.8		0.5		0.3
高分辨率					1.6		1.0		0.6		0.4		0.2
超高分辨率				1.3		0.8		0.5		0.4		0.2

****温度噪声BW(Hz)****
温度[℃]下的典型有效值噪声
温度过采样			关闭IIR过滤器
过采样 ×1			0.005
过采样 ×2			0.004
过采样 ×4			0.003
过采样 ×8			0.003
过采样 ×16			0.002

***********************************************************************************************************/

/****************************	使用场景与参数配置(官方手册写的) ************************************************
用例							模式				过采样设置		气压采样		温度采样		IIR滤波器		待机时间		ODR(Hz)		BW(Hz)
手持设备低功耗		正常				超高分辨			×16				×2				4						62.5ms		10.0			0.92
动态手持设备			正常				标准分辨			×4				×1				16					0.5ms			83.3			1.75
天气监测					强迫				超低功耗			×1				×1				关闭					1/min			1/60			全部			(最低功耗)
电梯/楼层				正常				标准分辨			×4				x1				4						125ms			7.3				0.67
跌落检测					正常				低功率				×2				×1				关闭					0.5ms			125				全部
室内导航					正常				超高分辨			×16				×2				16					0.5ms			26.3			0.55

**********************************************************************************************************/

// 正常模式下待机时间
typedef enum
{
	BMP280_Time_0MS5			= 0x00,				// 0.5 	Ms
	BMP280_Time_62MS5			= 0x20,				// 62.5	Ms
	BMP280_Time_125MS			= 0x40,				// 125	Ms
	BMP280_Time_250MS			= 0x60,				// 250	Ms
	BMP280_Time_500MS			= 0x80,				// 500	Ms
	BMP280_Time_1000MS		= 0xA0,				// 1000	Ms
	BMP280_Time_2000MS		= 0xC0,				// 2000	Ms
	BMP280_Time_4000MS		= 0xE0,				// 4000	Ms
}
BMP280_NormalMode_WaitTimeConfig;

// IIR过滤器的滤波器系数(手册中没给出具体取值，只能参考同位置寄存器取值)
typedef enum
{
	BMP280_IIRfilter_Close	= 0x00,				// 关闭滤波器
	BMP280_IIRfilter_X2			= 0x08,				// 系数2
	BMP280_IIRfilter_X4			= 0x0C,				// 系数4
	BMP280_IIRfilter_X8			= 0x10,				// 系数8
	BMP280_IIRfilter_X16		= 0x1C,				// 系数16
}
BMP280_IIRfilterConfig;

// 是否启用三线SPI接口
typedef enum
{
	BMP280_3SPIModeClose	= 0x00,				// 关闭三线SPI
	BMP280_3SPIModeOpen		= 0x01,				// 开启三线SPI
}
BMP280_3SPIMode;


// 初始化结构配置
typedef struct
{
	BMP280_TempConfig TempConfig;
	BMP280_PressConfig PressConfig;
	BMP280_PowerConfig PowerConfig;
	BMP280_3SPIMode SPIModeConfig;
	BMP280_IIRfilterConfig IIRfilterConfig;
	BMP280_NormalMode_WaitTimeConfig WaitTimeConfig;
}
BMP280_InitConfig;


/*****	底层函数	 *****/	
uint8_t BMP280_ReadReg(uint8_t reg);		// 基于BMP280 读寄存器 ID-地址-数据
void BMP280_WriteReg(uint8_t reg,uint8_t data);			// 基于BMP280 写寄存器 ID-地址-数据
uint16_t BMP280_ReadReg_u16_2Btye(uint8_t reg);			// 基于BMP280 读寄存器 ID-地址-无符号16位_2个数据
signed short BMP280_ReadReg_s16_2Btye(uint8_t reg);	// 基于BMP280 读寄存器 ID-地址-有符号16位_2个数据

/***** 初始化函数	 *****/
void BMP280_Init(BMP280_InitConfig *init);		// 初始化BMP280
void BMP280_InitDefault(BMP280_InitConfig *init);		// 填入初始化BMP280结构缺省值

/*****	私有函数	 *****/
void _BMP280_DataCorrection(void);	// (私有)数据修正参数读取
BMP280_S32_t _BMP280_OfficialTempCorrection(BMP280_S32_t adc_T);		// (私有)官方温度的数据转换
BMP280_S32_t _BMP280_OfficialPressCorrection(BMP280_S32_t adc_P);		// (私有)官方气压的数据转换
void _BMP280_ConvertWait(BMP280_NormalMode_WaitTimeConfig config);	// (私有)转换延时

/*****	功能函数	 *****/
uint8_t BMP280_getID(void);	// 获取器件ID
void BMP280_Reset(void);			// 复位BMP280
BMP280_S32_t BMP280_getTemp(BMP280_InitConfig *init);				// 获取温度数据
BMP280_S32_t BMP280_getPress(BMP280_InitConfig *init);				// 获取气压数据
void BMP280_setTempConfig(BMP280_TempConfig config);			// 单独设置温度配置
void BMP280_setPressConfig(BMP280_PressConfig config);		// 单独设置气压配置
void BMP280_setPowerConfig(BMP280_PowerConfig config);		// 单独设置电源模式
void BMP280_set3SPIModeConfig(BMP280_3SPIMode config);		// 单独设置是否开启3线SPI模式
void BMP280_setIIRfilterConfig(BMP280_IIRfilterConfig config);		// 单独设置IIR滤波器系数
void BMP280_setWaitTimeConfig(BMP280_NormalMode_WaitTimeConfig config);	// 单独设置正常模式下待机时间
void BMP280_setTempPressPowerConfig(BMP280_TempConfig config1,BMP280_PressConfig config2,BMP280_PowerConfig config3);		// 同时设置温度配置，气压配置，电源模式
void BMP280_setWaitIIRfilterSPIConfig(BMP280_NormalMode_WaitTimeConfig config1,BMP280_IIRfilterConfig config2,BMP280_3SPIMode config3);		//	同时设置正常模式下待机时间，IIR滤波器系数，是否开启3线SPI模式

#endif

